package sftp.util;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpException;
import com.neusoft.receivePolicy.sftp.core.SftpTemplate;
import lombok.extern.slf4j.Slf4j;

/**
 * 单节点Sftp工具类，使用之前请确保SftpTemplate成功注入
 */

@Slf4j
public class SingleNodeSftpUtils {

    private SingleNodeSftpUtils() {
    }

    /** 多节点
     * SftpTemplate 是sftp配置类对外的执行接口，分为单节点和单节点线程池两种，代码支持双节点，但是需要修改配置，当遇到不同ip时需要修改多ip ；直接修改配置文件，即可切换单节点，单线程池状态。
     */
    @SuppressWarnings("unchecked")
    private static SftpTemplate SftpTemplate = SpringUtils.getBean(SftpTemplate.class);


    /**
     * @Description: 将源文件上传至指定目录，支持绝对路径和 相对路径
     * 如果远程目录不存在会报错
     * @Param: [sourceFile, targetFile]
     * @return: boolean true=上传成功；false=上传失败
     * @Author: fengjd
     * @Date: 2022/6/28
     */
    public static boolean upload(String sourceFile, String targetFile) {
        try {
            SftpTemplate.upload(sourceFile, targetFile);
            return true;
        } catch (SftpException e) {
            log.error("upload exception", e);
            return false;
        }
    }

    /**
     * 下载文件
     *
     * @param sourceFile 远程文件地址，支持相对路径
     * @param targetFile 本地文件地址，支持相对路径
     * @return
     */
    public static boolean download(String sourceFile, String targetFile) {
        try {
            SftpTemplate.download(sourceFile, targetFile);
            return true;
        } catch (SftpException e) {
            log.error("download exception", e);
            return false;
        }
    }

    /**
     * 判断文件是否存在
     *
     * @param sourceFile 远程文件地址，支持相对路径
     * @return
     */
    public static boolean exist(String sourceFile) {
        try {
            SftpTemplate.exists(sourceFile);
            return true;
        } catch (SftpException e) {
            log.error("exists exception", e);
            return false;
        }
    }

    /**
     * 查看文件列表
     *
     * @param sourceFile 远程文件地址，支持相对路径
     * @return
     */
    public static ChannelSftp.LsEntry[] list(String sourceFile) {
        try {
            return SftpTemplate.list(sourceFile);
        } catch (SftpException e) {
            log.error("list exception", e);
            return null;
        }
    }

    /**
     * 查看当前目录
     *
     * @return
     */
    public static String pwd() {
        try {
            String execute = SftpTemplate.execute(ChannelSftp::pwd);
            return execute;
        } catch (SftpException e) {
            log.error("list exception", e);
            return null;
        }
    }

    /**
     * 执行自定义没有返回值的sftp操作
     *
     * 多用于自定义一组操作
     * @return 命令执行成功，命令执行失败
     */
    public static boolean executeWithoutResult() {
        try {
              SftpTemplate.executeWithoutResult(ChannelSftp-> System.out.println(ChannelSftp.getHome()));
            return true;
        } catch (SftpException e) {
            log.error("executeWithoutResult exception", e);
            return false;
        }
    }



    /* =================================================================   */


}